iT邦幫忙

第 11 屆 iThome 鐵人賽

1
自我挑戰組

JavaScript核心篇系列 第 15

【JavaScript 核心】淺層複製及深層複製 #15

  • 分享至 

  • xImage
  •  

有時必須將物件分離又礙於傳參考的特性,就會使用到淺層複製 or 深層複製

  1. 淺層複製:使用 for (var key in obj)
var family = {
  name: '小明家',
  members: {
    father: '老爸',
    mom: '老媽',
    ming: '小明'
  }
}

// 新增一空物件
var newFamily = {};

// 使用 for in 語法
for (var key in family){
  console.log(key);   
  // name 
  // members
  // key 值包含了 family 的第一層屬性
  
  console.log(family[key]);
  // name 小明家
  // members {father: '老爸', mom: '老媽',ming: '小明'}
  
  newFamily[key] = family[key];
}
newFamily.name = '杰倫家';
console.log(family, newFamily);
// {name: '小明家', members:{...}}
// {name: '杰倫家', members:{...}}



// 若是嘗試修改第二層屬性的內容
newFamily.members.ming = '大明';
console.log(family, newFamily);
// {name: '小明家', members:{father: '老爸', mom: '老媽', ming: '大明'}}
// {name: '杰倫家', members:{father: '老爸', mom: '老媽', ming: '大明'}}

// 兩個 members 物件內容的 ming 都被修改成 '大明' 了
// 第二層以上還是會以傳參考的形式去做修改
  1. 淺層複製:jQuery 語法 - extend()
var newFamily2 = jQuery.extend({}, family);
  1. 淺層複製:ES6
var newFamily3 = Object.assign({}, family);

  1. 深層複製:透過 JSON.stringify 將原本物件轉為字串,然後再用 JSON.parse 轉回物件
var newFamily4 = JSON.parse(JSON.stringify(family));
newFamily4.name = '杰倫家';
newFamily4.members.ming = '大明';

console.log(family, newFamily);
// {name: '小明家', members:{father: '老爸', mom: '老媽', ming: '小明'}}
// {name: '杰倫家', members:{father: '老爸', mom: '老媽', ming: '大明'}}
// 修改後也不會影響到原本的物件內容,兩者之間完全沒有關聯

上一篇
【JavaScript 核心】傳值 & 傳參考 #14
下一篇
【JavaScript 核心】什麼是函式 #16
系列文
JavaScript核心篇19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言